<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ES5继承</title>
</head>
<body>
    <script>
        function Animal(name,age){
            this.name = name;
            this.age = age;
        }
        

        Animal.prototype.run = function(){
            console.log('i can run');
        }

        // Dog 要拥有 Animal类的所有属性和方法
        //     1. 继承属性
        //     2. 继承方法

        function Dog(name,age,color){
            // 继承父类属性，在子类里面运行父类函数,通过call运行，改变父类函数this指向
            Animal.call(this,name,age); 
            this.color = color;
        }
        // 方法的继承
        // 1. 让子类的 原型 = 父类new出来的实例
        // 2. 修正 constructor 指向

        // let a1 = new Animal();
        // Dog.prototype = a1;
        Dog.prototype = new Animal();
        Dog.prototype.constructor = Dog;
        Dog.prototype.eat = function(){
            console.log(' i can eat ');
        }
        Dog.prototype.buck = function(){
            console.log(' i can buck ');
        }

        let d1 = new Dog('wangcai',17,'white');
        d1.run();
        d1.eat();
        d1.buck();

        

        // 总结：
        // ES5 组合继承
        // 1. 属性的继承   子类的构造函数中运行 父类   父类.call(this,参数1，。。。。)
        // 2. 方法的继承   子类.prototype = new 父类
        //                子类.prototype.constructor = 子类

    </script>
</body>
</html>